/*
 * Copyright 2013 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.aplink.generic.google.maps.geometry;

/**
 * Represents an area in the cartesian plane.
 */
public class Bounds {
    public final double maxX;
    public final double maxY;

    public final double midX;
    public final double midY;

    public final double minX;
    public final double minY;

    public Bounds(final double minX, final double maxX, final double minY,
            final double maxY) {
        this.minX = minX;
        this.minY = minY;
        this.maxX = maxX;
        this.maxY = maxY;

        midX = (minX + maxX) / 2;
        midY = (minY + maxY) / 2;
    }

    public boolean contains(final Bounds bounds) {
        return (bounds.minX >= minX) && (bounds.maxX <= maxX)
                && (bounds.minY >= minY) && (bounds.maxY <= maxY);
    }

    public boolean contains(final double x, final double y) {
        return (minX <= x) && (x <= maxX) && (minY <= y) && (y <= maxY);
    }

    public boolean contains(final Point point) {
        return contains(point.x, point.y);
    }

    public boolean intersects(final Bounds bounds) {
        return intersects(bounds.minX, bounds.maxX, bounds.minY, bounds.maxY);
    }

    public boolean intersects(final double minX, final double maxX,
            final double minY, final double maxY) {
        return (minX < this.maxX) && (this.minX < maxX) && (minY < this.maxY)
                && (this.minY < maxY);
    }
}
